home *** CD-ROM | disk | FTP | other *** search
Oberon Text | 1990-08-30 | 8.2 KB | 147 lines | [.Ob./.Ob*] |
- Syntax10.Scn.Fnt
- MODULE SampleApp; (* Sample Macintosh Application Running under MacOberon Michael Franz, 30.08.90 *)
- IMPORT
- TY:= MacTypes, DL:= MacDialogs, DS:= MacDesk, EM:= MacEvents, MN:= MacMenus,
- QD:= MacQuickDraw, TE:= MacTextEdit, WM:= MacWindows, Display, SYSTEM;
- CONST (* Resource ID Definitions. *)
- (* About Sample Alert *) rAboutAlert= 128;
- (* Sample MenuBar *) rSampleMBar= 128;
- (* Apple Menu *) mApple= 128; iAbout= 1;
- (* File Menu *) mFile= 129; iQuit= 1;
- (* Edit Menu *) mEdit= 130; iUndo= 1; iCut= 3; iCopy= 4; iPaste= 5; iClear= 6; (* Standard Ordering. *)
- (* Sample Menu *) mSamp= 131; iNew= 1;
- inForeground: BOOLEAN; (* Flag set if Application Currently in the Foreground [MultiFinder]. *)
- winCounter: SHORTINT; (* Application Window Number. *)
- terminate: BOOLEAN; (* Return to Oberon on next Loop Iteration when TRUE. *)
- theResFile: INTEGER; (* Reference Number of Sample's Ressource File. *)
- (* Switching Between the "Look And Feel" of Oberon and that of Sample. *)
- PROCEDURE - OpenResFile(fileName: TY.Str255): INTEGER 0A9H, 097H;
- PROCEDURE - CloseResFile(refNum: INTEGER) 0A9H, 09AH;
- PROCEDURE SetupSampleLooks*;
- VAR resName: TY.Str255; mb: TY.Handle;
- BEGIN TY.SetStr255("SampleApp.r", resName); theResFile:= OpenResFile(resName);
- mb := MN.GetNewMBar(rSampleMBar); MN.SetMenuBar(mb);
- MN.AddResMenu(MN.GetMHandle(mApple), 44525652H); (* DRVR *)
- MN.AddResMenu(MN.GetMHandle(mSamp), 464F4E54H); (* FONT *)
- MN.DrawMenuBar; QD.SetCursor(QD.globals.arrow); Display.Hide
- END SetupSampleLooks;
- PROCEDURE RestoreOberonLooks*;
- BEGIN CloseResFile(theResFile); Display.ShowStdMenus; Display.ShowStdArrow; Display.Show
- END RestoreOberonLooks;
- (* The Sample Application. *)
- PROCEDURE IsOberonWindow(window: WM.WindowPtr): BOOLEAN; (* Check if Window belongs to Oberon Shell. *)
- BEGIN RETURN window=SYSTEM.VAL(WM.WindowPtr, Display.window)
- END IsOberonWindow;
- PROCEDURE IsDAWindow(window: WM.WindowPtr): BOOLEAN; (* Check if a Window belongs to a Desk Accessory. *)
- BEGIN RETURN (window#NIL)&(window.windowKind < 0)
- END IsDAWindow;
- PROCEDURE IsAppWindow(window: WM.WindowPtr): BOOLEAN; (* Check if a Window belongs to the Sample Application. *)
- BEGIN RETURN (window#NIL)&~IsOberonWindow(window)&((window.windowKind >= WM.userKind) OR (window.windowKind = WM.dialogKind))
- END IsAppWindow;
- PROCEDURE NewWindow*; (* Create a New Application TextEdit Window #nn and Enable AutoScroll. *)
- VAR winTitle: TY.Str255; wbounds, tbounds: TY.Rect; window: WM.WindowPtr; thePort: QD.GrafPtr; text: TE.TEHandle;
- BEGIN wbounds.top := QD.globals.screenBits.bounds.top + 40 + 10 * (winCounter MOD 10);
- wbounds.left := QD.globals.screenBits.bounds.left + 20 + 10 * (winCounter MOD 10);
- wbounds.bottom := wbounds.top + 200; wbounds.right := wbounds.left + 300;
- INC(winCounter); winTitle[0] := 3; winTitle[1] := 23H;
- winTitle[2] := (winCounter DIV 10) MOD 10 + 30H; winTitle[3] := winCounter MOD 10 + 30H;
- window := WM.NewWindow(NIL, wbounds, winTitle, TRUE, 4, SYSTEM.VAL(WM.WindowPtr, -1), TRUE, 0);
- QD.GetPort(thePort); QD.SetPort(window); tbounds.left := 5; tbounds.top := 5;
- tbounds.right := wbounds.right - wbounds.left - 10; tbounds.bottom := wbounds.bottom - wbounds.top - 10;
- text := TE.TENew(tbounds, tbounds); text.p.txFont := 3; text.p.txSize := 12; TE.TEAutoView(TRUE, text);
- window.refCon := SYSTEM.VAL(LONGINT, text); QD.SetPort(thePort)
- END NewWindow;
- PROCEDURE DrawWindow(window: WM.WindowPtr); (* Draw the Contents of the Application Window. *)
- BEGIN QD.SetPort(window); TE.TEUpdate(window.portRect, SYSTEM.VAL(TE.TEHandle, window.refCon))
- END DrawWindow;
- PROCEDURE CloseWindow(window: WM.WindowPtr); (* Close a Window. *)
- BEGIN
- IF IsDAWindow(window) THEN DS.CloseDeskAcc(window.windowKind) ELSE WM.CloseWindow(window) END
- END CloseWindow;
- PROCEDURE Terminate; (* Close all Windows and Return to Oberon. *)
- VAR aWindow: WM.WindowPtr;
- BEGIN terminate := TRUE; aWindow := WM.FrontWindow(); (* Currently Visible Front Window *)
- WHILE aWindow # NIL DO CloseWindow(aWindow); aWindow := WM.FrontWindow() END
- END Terminate;
- PROCEDURE AdjustMenus; (* Enable and Disable Menus based on the Current Processing State. *)
- VAR window: WM.WindowPtr; menu: MN.MenuHandle;
- BEGIN window := WM.FrontWindow(); menu := MN.GetMHandle(mEdit);
- IF IsDAWindow(window) THEN (* A Desk Accessory might Need the Edit Menu. *)
- MN.EnableItem(menu, iUndo); MN.EnableItem(menu, iCut); MN.EnableItem(menu, iCopy);
- MN.EnableItem(menu, iPaste); MN.EnableItem(menu, iClear)
- ELSE (* But We Do Not. *)
- MN.DisableItem(menu, iUndo); MN.DisableItem(menu, iCut); MN.DisableItem(menu, iCopy);
- MN.DisableItem(menu, iClear); MN.DisableItem(menu, iPaste)
- END
- END AdjustMenus;
- PROCEDURE MenuCommand(menuResult: LONGINT); (* Item has been Chosen (by MenuSelect or MenuKey). *)
- CONST noMenu= 0;
- VAR menuID, menuItem: INTEGER; daName: TY.Str255; daRefNum: INTEGER; itemHit: INTEGER; handledByDA: BOOLEAN;
- BEGIN menuID := SHORT(menuResult DIV 10000H); menuItem := SHORT(menuResult MOD 10000H);
- CASE menuID OF
- | noMenu: (* Menu Exited during MenuSelect. *)
- | mApple:
- IF menuItem = iAbout THEN itemHit := DL.Alert(rAboutAlert, NIL)
- ELSE MN.GetItem(MN.GetMHandle(mApple), menuItem, daName); daRefNum := DS.OpenDeskAcc(daName)
- END
- | mFile: IF menuItem = iQuit THEN Terminate END
- | mEdit: IF IsDAWindow(WM.FrontWindow()) THEN handledByDA := DS.SystemEdit(menuItem-1) END
- | mSamp: IF menuItem = iNew THEN NewWindow END
- END;
- MN.HiliteMenu(noMenu) (* Unhighlight what MenuSelect (or MenuKey) Highlighted. *)
- END MenuCommand;
- PROCEDURE Update(window: WM.WindowPtr); (* This is Called when an Update Event is Received. *)
- BEGIN
- IF IsAppWindow(window) THEN WM.BeginUpdate(window);
- IF ~QD.EmptyRgn(window.visRgn) THEN
- TE.TEUpdate(window.portRect, SYSTEM.VAL(TE.TEHandle, window.refCon))
- END;
- WM.EndUpdate(window)
- END
- END Update;
- PROCEDURE Activate(window: WM.WindowPtr; becomingActive: BOOLEAN); (* Window is Activated or Deactivated. *)
- BEGIN
- IF IsAppWindow(window) THEN
- IF becomingActive THEN QD.SetPort(window); TE.TEActivate(SYSTEM.VAL(TE.TEHandle, window.refCon))
- ELSE TE.TEDeactivate(SYSTEM.VAL(TE.TEHandle, window.refCon)) END
- END
- END Activate;
- PROCEDURE Loop*();
- VAR gotEvent: BOOLEAN; event: EM.EventRecord; window: WM.WindowPtr; key: TY.UnpackedChar;
- BEGIN SetupSampleLooks; terminate := FALSE;
- REPEAT gotEvent := EM.WaitNextEvent(EM.everyEvent, event, 0, NIL);
- CASE event.what OF
- | EM.mouseDown:
- CASE WM.FindWindow(event.where, window) OF
- | WM.inMenuBar: AdjustMenus; MenuCommand(MN.MenuSelect(event.where))
- | WM.inSysWindow: DS.SystemClick(event, window)
- | WM.inContent:
- IF window # WM.FrontWindow() THEN WM.SelectWindow(window)
- ELSE QD.GlobalToLocal(event.where);
- TE.TEClick(event.where, FALSE, SYSTEM.VAL(TE.TEHandle, window.refCon))
- END
- | WM.inDrag: WM.DragWindow(window, event.where, QD.globals.screenBits.bounds)
- | WM.inGoAway: CloseWindow(window)
- | WM.inDesk, WM.inGrow, WM.inZoomIn, WM.inZoomOut:
- END;
- | EM.keyDown: (* message: bits 0..7=character code / modifiers: bit8: 0=cmdKeyUp 1=cmdKeyDown *)
- key := SHORT(event.message MOD 100H);
- IF 8 IN SYSTEM.VAL(SET, LONG(event.modifiers)) THEN AdjustMenus; MenuCommand(MN.MenuKey(key))
- ELSE window := WM.FrontWindow(); TE.TEKey(key, SYSTEM.VAL(TE.TEHandle, window.refCon)) END
- | EM.autoKey:
- key := SHORT(event.message MOD 100H); (* bits 0..7=character code *)
- window := WM.FrontWindow(); TE.TEKey(key, SYSTEM.VAL(TE.TEHandle, window.refCon))
- | EM.updateEvt: Update(SYSTEM.VAL(WM.WindowPtr, event.message))
- | EM.activateEvt: Activate(SYSTEM.VAL(WM.WindowPtr, event.message), ODD(event.modifiers)) (* bit0: 0=deactivate 1=activate *)
- | EM.app4Evt: (* OS Event under MultiFinder; bit31..bit24=00000001: SuspendResumeEvt *)
- IF SYSTEM.LSH(event.message, -24) (*MOD 100H*) = 1 THEN (* bit0: 0=deactivate 1=activate *)
- inForeground := ODD(event.message); Activate(WM.FrontWindow(), inForeground);
- END
- ELSE (* Ignore Other Event Types *)
- END (* Dispatch on Event Type *)
- UNTIL terminate;
- RestoreOberonLooks
- END Loop;
- BEGIN inForeground := TRUE
- END SampleApp.
-